package com.j180.springdatajpa_demo.dao;


import com.j180.springdatajpa_demo.bean.CountBean;
import com.j180.springdatajpa_demo.bean.UserBean;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

//以后使用jpa的话 就是继承 JpaRepository
public interface IUsetDao extends JpaRepository<UserBean,Integer> {

      /*定义查询的方法有两个方式
       第一种 以方法名的方式来创建查询
       第二种: 以自定义的方法（jpql 和  自定义sql的方式）
       */
    public List<UserBean> findUserBeanByGender(String gender);

    public List<UserBean> getUserBeanByAgeAfterAndAgeBefore(int minAge,int maxAge);

    public List<UserBean> getUserBeanByAgeBetween(int minAge,int maxAge);

   public List<UserBean> getUserBeanByNameContains(String name);

   public List<UserBean> getUserBeanByNameStartingWithAndAgeGreaterThanEqual(String name,int age);

   /*
    jpql  jpa query language : jpa的查询语句 ： 特点：面向对象的查询语句
      ? 表示占位符  1 表示第一个位置  (不推荐)
     :值  表示占位符  值的参数名 (注意  :值 之间不能有空格)
    */
    /*@Query(" From UserBean  where gender=?1 ")
    public List<UserBean>  getUserGender(String gender);
*/
   @Query(" From UserBean  where gender=:stugender")
   public List<UserBean>  getUserGender(@Param("stugender") String gender);

    @Query("From UserBean where name like :name% and age>=:age ")
    public List<UserBean> getUserBeanByNameAndAge(@Param("name") String name,@Param("age") int age);

    /**
     * 当使用dml语句时  一定加上@Modifying来表示它是一个dml语句
     * @param id
     * @return
     */
     @Query("delete from UserBean  where id=?1")
     @Modifying //修改
     @Transactional(propagation = Propagation.REQUIRED)
     public int deleteUser(int id);

    /**
     * select 的使用： 使用jpql时 不能使用*
     * 如果要转为对象是 就不需要写select
     *
     *如果要想返回属性的一部分值的时候（select 后面有列名的时候），
     * 默认是返回的是一条数据对应一个object[] 0->name 1->gender
     *
     */
    @Query("from  UserBean ")
    public List<UserBean> getAll();

    @Query("select name,gender from  UserBean")
    public List<Object[]>  getAll2();

  /*  @Query("select name,gender from  UserBean where id=?1")
    public Object[]  getUserId(int id);
*/
    //推荐用全类名
    @Query("select new com.j180.springdatajpa_demo.bean.UserBean(name,gender) from  UserBean")
    public List<UserBean>  getAll3();

   @Query("select  new com.j180.springdatajpa_demo.bean.CountBean(gender, count(*)) from UserBean  group by  gender")
    public List<CountBean> getAllCountBean();

     //使用map的方式封装对象（推荐）
    @Query("select  new map(gender as stuGender, count(*) as num) from UserBean  group by  gender")
    public List<Map<String,Object>> getAllCountBean2();

    //nativeQuery = true  表示使用原生的sql (不推荐)
    @Query(value = "select ugender,count(*) from t_user group by ugender",nativeQuery = true)
    public List<Object[]> getAllCountBean3();



}

